
var read_line = require('readline-sync')
read_line.setDefaultOptions({ prompt: '' })
var read_line = read_line.prompt
class Edge {
  constructor(a, b, w) {
    this.a = a
    this.b = b
    this.w = w // 每条边的起点终点权重
  }
}
let [n, m, k] = read_line().split(' ').map((item) => parseInt(item)) // 读取三个整数

let edge = []
for (let i = 1; i <= m; i++) { // 每条边
  let [a, b, w] = read_line().split(' ').map((item) => parseInt(item)) // 读取三个整数
  edge[i] = new Edge(a, b, w) // 生成所有的边
}
let t = bellManFord(edge) // 利用算法计算
if (t === -1) {
  console.log('impossible')
} else {
  console.log(t)
}
function bellManFord (edge) {
  let dist = new Array(n + 1).fill(Infinity) // 初始化都是无穷大
  dist[1] = 0 // 1到1是0
  while (k) { // 进行k次操作
    // 每次对dist数组备份一份
    // 备份原因:每次智慧从上一轮的结果里面去改动,不会被本轮改动的值所影响
    let copy = [...dist]
    // 对每个边进行遍历,找到长度为k的最短距离
    for (let i = 1; i <= m; i++) {
      let a = edge[i].a
      let b = edge[i].b
      let w = edge[i].w
      dist[b] = Math.min(copy[a] + w, dist[b])
    }
    k--
  }
  // 为了防止1~n没有路径,但是可以从max通过一个负值进行更新的情况
  if (dist[n] > Infinity / 2) {
    return -1
  } else {
    return dist[n]
  }
}